// 4. 引用
/**
 * 1. 指针与引用的区别 （a. 是否可以为空 b. 是否可以改变指向 c. 定义时必须初始化）
 * 2. 创建引用 (语法: type &var_name_ = var_name;)
 * 3. 引用传入函数（函数定义、声明、使用）
 * 4. 函数返回引用（#41 函数使用语句可以做赋值语句左值、#42 static）
 * 
 * 扩展:
 * 1. 
 * 
*/

#include <iostream>
#define __mark 42

/*
 * #41 函数使用语句可以做赋值语句左值
*/
#if __mark == 41

int nums[5];
int &setValue(int);
int main(void)
{

  setValue(3) = 20;

  std::cout << "nums[3] : " << nums[3] << std::endl;

  printf("-------------end----------------\n");
  // system("pause");
  return 0;
}

int &setValue(int i)
{
  int &ref = nums[i];
  return ref;
}

#elif __mark == 42
int &test_1(int);
int &test_2(int);
int &test_3();
int main()
{
  int t;
  t = test_1(1);
  std::cout << t << std::endl; // 1
  t = test_2(2);
  std::cout << t << std::endl; // 2
  t = test_3();
  std::cout << t << std::endl;
  printf("-------------end----------------\n");
  // system("pause");
  return 0;
}

int &test_1(int i)
{
  int &ref = i;
  return ref;
}

int &test_2(int i)
{
  int t = i;
  // int t = 2;
  int &ref = t;
  return ref;
}

int &test_3()
{
  int t = 3;
  return t;
}

#elif __mark == 'z'

int main()
{

  printf("-------------end----------------\n");
  // system("pause");
  return 0;
}

#endif